/** 
* @file        demo_zos_task.c
* @ingroup     task demo
* @brief       演示task 创建 删除
*/
/**
 * @defgroup task demo
 */

#include "zos_config.h"

#ifdef BOARD_USING_MQ_DEMO
#include "zos.h"

//定义队列demo的任务句柄
zos_task_t mq_demo_task1_handle = ZOS_NULL;
zos_task_t mq_demo_task2_handle = ZOS_NULL;

//定义队列句柄
zos_mq_t demo_mq = ZOS_NULL;

//定义队列接收消息累计存储数组
uint8_t mq_str[30]={0};


//任务1执行函数
void mq_demo_task1(void *parameter)
{
    zos_uint8_t *buf = ZOS_NULL;
    zos_uint8_t cnt = 0;
    while (1)
    {
        //从消息队列中接收消息,存储到buf指针
        if (zos_mq_recv(demo_mq,(void*)(&buf),0,ZOS_WAITING_FOREVER)  == ZOS_EOK)
        {
            //将接收到的消息拷贝到mq_str数组
            memcpy(&mq_str[cnt],(void*)(&buf),1);

            //打印接收到的信息
            zos_printf("task1: recv msg from msg queue, the content:%c\r\n", buf);
            if (cnt == 25)
            {
                break;
            }
        }
        
        //延时50ms
        cnt++;
        zos_task_delay(50);
    }
    zos_printf("queue recv msg is:%s\r\n",mq_str);
    zos_printf("task1: delete mq \r\n");
    zos_mq_delete(demo_mq);

    mq_demo_task1_handle = ZOS_NULL;
    zos_task_exit();
}
//任务2执行函数
void mq_demo_task2(void *parameter)
{
    int result;
    char buf = 'A';

    zos_uint8_t cnt = 0;
    while (1)
    {
        
        if(cnt>= 26)/* 发 送 20 次 消 息 之 后 退 出 */
        {
            zos_printf("message queue stop send, task2 quit\r\n");
            break;
        }
        else
        {
            /* 发 送 消 息 到 消 息 队 列 中 */
            result = zos_mq_send(demo_mq,(void*)(&buf),0,500);
            if(result != ZOS_EOK)
            {
                zos_printf("task2 mq send error\r\n");
            }
            zos_printf("task2: send message - %c\r\n", buf);
        }
        buf++;
        cnt++;
        //延时5ms
        zos_task_delay(5);
    }

    mq_demo_task2_handle = ZOS_NULL;
    zos_task_exit();
        
}

//任务初始化
int mq_demo_task_init(int argc, char *argv[])
{
	//创建队列
	demo_mq = zos_mq_create(50,sizeof(void *));

    //创建用户任务，注意任务的Priority 优先级不能全部设置为同一个等级，自己后期创建的任务需要根据任务的情况适当的降低或者提高优先级。
	
    //创建任务1
	mq_demo_task1_handle = zos_task_create("mq_demo_task1",mq_demo_task1,ZOS_NULL,1024,task_Priority_Normal);

	//创建任务2
	mq_demo_task2_handle = zos_task_create("mq_demo_task2",mq_demo_task2,ZOS_NULL,1024,task_Priority_Normal);
    return	ZOS_EOK;
}

#include "shell.h"

SHELL_EXPORT_CMD(demo_mq,mq_demo_task_init, mq demo);

#endif









